package pe.com.android.model.dao.imp;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.ResultSet;
import java.util.ArrayList;

import pe.com.android.model.bean.Usuario;
import pe.com.android.model.dao.DBConnection;
import pe.com.android.model.dao.UsuarioDAO;

/**
* @author Marko Ramirez Larzo
*/
public class UsuarioDAOImp implements UsuarioDAO{

	public Usuario autenticar(String login, String password) {
        Usuario usuario = null;
        CallableStatement cs =null;
        ResultSet rs = null;
        //Paso 1: Se obtiene la conexion a la BD
        Connection conn = DBConnection.getConnection();
         //Paso 2: Se define o prepara la sentencia
        String sql = "{call usp_UsuarioLogin(?,?)}";
        try {
            cs = conn.prepareCall(sql);
            cs.setString(1, login);
            cs.setString(2, password);
            //Paso 3: Ejecutamos la sentencia
            rs = cs.executeQuery();
            //Paso 4: Evaluamos el resultado
            if (rs.next()){
                usuario = new Usuario();
                usuario.setLogin(login);
                usuario.setPassword(password);
                usuario.setNombre(rs.getString("NOMBRE"));                
                usuario.setApellido(rs.getString("APELLIDO")); 
                usuario.setEstado(rs.getString("ESTADO"));
                usuario.setInterfacc(rs.getString("INTERFACE_ACC"));
                usuario.setNivelacc(rs.getString("NIVEL_ACC"));
                usuario.setFecha(rs.getDate("FECHA"));
                
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        } finally{
        	try { if(rs!=null) rs.close();} catch (Exception e) { e.printStackTrace(); }
        	try { if(cs!=null) cs.close();} catch (Exception e) { e.printStackTrace(); }
        	try { if(conn!=null) conn.close();} catch (Exception e) { e.printStackTrace(); }							
        }        
        return usuario;        

	}

	public void eliminaUsuario(String login) {
        //Paso 1: Se obtiene la conexion a la BD
        Connection conn = DBConnection.getConnection();
        CallableStatement cs =null;
         //Paso 2: Se define o prepara la sentencia
        String sql = "{call usp_UsuarioDelete(?)}";
        try {
             cs = conn.prepareCall(sql);
             cs.setString(1, login);
            //Paso 3: Ejecutamos la sentencia
            //int i = 
                cs.executeUpdate();
        } catch (Exception ex) {
            ex.printStackTrace();
        } finally{
        	try { if(cs!=null) cs.close();} catch (Exception e) { e.printStackTrace(); }
        	try { if(conn!=null) conn.close();} catch (Exception e) { e.printStackTrace(); }							
        }       		
	}

	public void insertaUsuario(Usuario usuario) {
		CallableStatement cs =null;
        //Paso 1: Se obtiene la conexion a la BD
        Connection conn = DBConnection.getConnection();
         //Paso 2: Se define o prepara la sentencia
        String sql = "{call usp_UsuarioInsert(?,?,?,?,?,?,?)}";
        try {
                cs = conn.prepareCall(sql);
                cs.setString(1, usuario.getLogin());
                cs.setString(2, usuario.getPassword());
                cs.setString(3, usuario.getNombre());
                cs.setString(4, usuario.getApellido());
                cs.setString(5, usuario.getEstado());
                cs.setString(6, usuario.getInterfacc());
                cs.setString(7, usuario.getNivelacc());
            //Paso 3: Ejecutamos la sentencia
            //int i = 
                cs.executeUpdate();
        } catch (Exception ex) {
            ex.printStackTrace();
        } finally{
        	try { if(cs!=null) cs.close();} catch (Exception e) { e.printStackTrace(); }
        	try { if(conn!=null) conn.close();} catch (Exception e) { e.printStackTrace(); }							
        }        
		
	}

	public void modificaUsuario(Usuario usuario) {
        //Paso 1: Se obtiene la conexion a la BD
        Connection conn = DBConnection.getConnection();
        CallableStatement cs =null;
         //Paso 2: Se define o prepara la sentencia
        String sql = "{call usp_UsuarioUpdate(?,?,?,?,?,?,?)}";
        try {
                cs = conn.prepareCall(sql);
                cs.setString(1, usuario.getLogin());
                cs.setString(2, usuario.getPassword());
                cs.setString(3, usuario.getNombre());
                cs.setString(4, usuario.getApellido());
                cs.setString(5, usuario.getEstado());
                cs.setString(6, usuario.getInterfacc());
                cs.setString(7, usuario.getNivelacc());
            //Paso 3: Ejecutamos la sentencia
            //int i = 
            	cs.executeUpdate();
        } catch (Exception ex) {
            ex.printStackTrace();
        } finally{
        	try { if(cs!=null) cs.close();} catch (Exception e) { e.printStackTrace(); }
        	try { if(conn!=null) conn.close();} catch (Exception e) { e.printStackTrace(); }
        }		
	}

	public ArrayList<Usuario> obtenerTodos() {
        ArrayList<Usuario> usuarios = new ArrayList<Usuario>();
        //Paso 1: Se obtiene la conexion a la BD
        Connection conn = DBConnection.getConnection();
        CallableStatement cs =null;
        ResultSet rs =null;
         //Paso 2: Se define o prepara la sentencia
        String sql = "{call usp_UsuariosList()}";
        try {
            cs = conn.prepareCall(sql);
            //Paso 3: Ejecutamos la sentencia
            rs = cs.executeQuery();
            //Paso 4: Evaluamos el resultado
            while (rs.next()){                
                                
                Usuario usuario = new Usuario();
                
                usuario.setLogin(rs.getString("LOGIN"));
                usuario.setPassword(rs.getString("PASSWORD"));
                usuario.setNombre(rs.getString("NOMBRE"));
                usuario.setApellido(rs.getString("APELLIDO"));
                usuario.setEstado(rs.getString("ESTADO"));
                usuario.setInterfacc(rs.getString("INTERFACE_ACC"));
                usuario.setNivelacc(rs.getString("NIVEL_ACC"));
                usuario.setFecha(rs.getDate("FECHA"));

                usuarios.add(usuario);
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        } finally{
        	try { if(rs!=null) rs.close();} catch (Exception e) { e.printStackTrace(); }
        	try { if(cs!=null) cs.close();} catch (Exception e) { e.printStackTrace(); }
        	try { if(conn!=null) conn.close();} catch (Exception e) { e.printStackTrace(); }
        }       
        return usuarios;        

	}

	public Usuario obtenerUsuario(String login) {
        Usuario usuario = null;
        CallableStatement cs =null;
        ResultSet rs = null;	
        //Paso 1: Se obtiene la conexión a la BD
        Connection conn = DBConnection.getConnection();
         //Paso 2: Se define o prepara la sentencia
        String sql = "{call usp_UsuarioSearch(?)}";
        try {
             cs = conn.prepareCall(sql);
             cs.setString(1, login);
             //Paso 3: Ejecutamos la sentencia
             rs = cs.executeQuery();
             //Paso 4: Evaluamos el resultado
            if (rs.next()){
                usuario = new Usuario();
                
                usuario.setLogin(rs.getString("LOGIN"));
                usuario.setPassword(rs.getString("PASSWORD"));
                usuario.setNombre(rs.getString("NOMBRE"));
                usuario.setApellido(rs.getString("APELLIDO"));
                usuario.setEstado(rs.getString("ESTADO"));
                usuario.setInterfacc(rs.getString("INTERFACE_ACC"));
                usuario.setNivelacc(rs.getString("NIVEL_ACC"));
                usuario.setFecha(rs.getDate("FECHA"));

            }
        } catch (Exception ex) {
            ex.printStackTrace();
        } finally{
        	try { if(rs!=null) rs.close();} catch (Exception e) { e.printStackTrace(); }
        	try { if(cs!=null) cs.close();} catch (Exception e) { e.printStackTrace(); }
        	try { if(conn!=null) conn.close();} catch (Exception e) { e.printStackTrace(); }							
        }        
        return usuario;        

	}

}

